package com.findyou.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * @Title: ConnectionUtils
 * @Author 贾金博
 * @Package com.findyou.utils
 * @Date 2024/11/28 上午11:18
 * @description: 从数据源中获得一个连接，并把连接绑定到线程
 */
@Component
public class ConnectionUtils {

    @Autowired
    private DataSource dataSource;

    // 线程的内部存储类，保存每个线程独立的数据库连接
    private ThreadLocal<Connection> threadLocal = new ThreadLocal<>();

    /**
     * 获取当前线程绑定的数据库连接，如果没有，则从 DataSource 获取一个新的连接并绑定到当前线程
     *
     * @return 当前线程的数据库连接
     */
    public Connection getThreadConnection() {
        Connection conn = threadLocal.get();  // 从 ThreadLocal 中获取连接
        try {
            if (conn == null) {
                conn = dataSource.getConnection();  // 如果没有连接，则从 DataSource 获取一个新的连接
                threadLocal.set(conn);  // 绑定连接到当前线程
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 解除当前线程的连接绑定
     */
    public void removeThreadConnection() {
        threadLocal.remove();
    }
}
